package com.cskaoyan.javase.string._1notvar;

/**
 * @description: 字符串对象具有不可变性
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Scanner;

/**
 * 引例
 * 键盘输入接收一个字符串s，并用一个temp字符串引用指向它
 * 现在修改原先字符串s（拼接一个字符串），比较s和temp
 *
 * String对象不可变:
 *      String内部是使用 private final char value[] 来存储字符串内容
 *      它是一个final修饰的数组,意味着:
 *          a.引用value指向的对象不可变
 *          b.value引用指向的char数组对象的元素是可变的
 *
 *    如果想要修改字符串内容,对应需要修改value数组,但是value数组是final修饰的,不能指向一个新的char数组
 *    并且直接修改数组内容局限性太大,
 *    所以Java当中任何一个String对象只要被创建出来,那么其中的value数组就不会修改了
 *    如果使用引用去修改字符串内容,会直接指向一个新的String对象
 *
 * 以上就是所谓的"String对象不可变"
 *
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串: ");
        String s = sc.nextLine();
        String temp = s;
        s = s + "是大帅哥!";

        System.out.println(s);
        System.out.println(temp);
        //按照之前修改对象的状态不改变对象本质的理解,这里应该返回true
        //但是由于String对象不可变,所以s被修改了指向了一个新的String对象,返回false
        System.out.println(s == temp); */


        //String对象不可变,指的是一个String对象创建出来后,它的状态不可变
        //如果想要修改它的状态,就必须要指向新的对象
        String s = "hello";
        s += "world";
        System.out.println(s);

    }
}
